package com.edu.aspect;

import com.edu.bean.CommonResult;
import org.aspectj.apache.bcel.classfile.ExceptionTable;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Date;

/*
 * @Author:mx
 * @Date:2025/11/12-9:41:49
 */
/*
*       通知 定义 如何增强的类 就做通知类
*       SpringAOP 不需要 我们去实现 任何额外的接口
*
* */
public class MyAdvise {

    /*
    *       通知类 可以定义一些方法，我们把 做的那些额外操作 放在 方法里的。
    *
    *
    *           前置通知:
    *               方法的参数中 可以加入JointPoint 表示 被切面拦截到的 连接点
    *               JoinPoint常用方法:
    *                   jt.getSignature().getName() 获取 被强化的方法的 方法名
    *                   jt.
    * */
    public void beforeAdvise(JoinPoint jt){
        System.out.println(jt.getSignature().getName());
        System.out.println(jt.getTarget().getClass());
        System.out.println("前置通知");
    }

    /*
    *
    *    后置返回通知
    *           参数中可以 加入 JoinPoint
    *           也可以加入一个 Object类型的参数接受 方法的返回值
    * */
    public void afterReturnAdvise(JoinPoint jt,Object re){
        System.out.println(re);
        System.out.println("后置返回通知"+jt.getSignature().getName());
    }


    /*
    *       后置异常通知:
    *           原本业务方法执行过程中 发生了异常时，才执行的通知
    *
    * */

    public void afterExceptionAdvise(JoinPoint jt, Exception e){
        e.printStackTrace();
        System.out.println("程序出错啦 走远了");
    }

    public void afterAdvise(JoinPoint jt){
        System.out.println("执行了后置通知");
    }

    public Object aroundAdvise(ProceedingJoinPoint pjt){
        System.out.println("环绕通知前置");
        Object obj  = null;
        try {
            obj = pjt.proceed(pjt.getArgs());

        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("环绕通知后置");
        return obj;
    }


}
